🌿 🍃 🌱
02 OPTION

MySQL 数据表管理

数据表就是数据库里的"Excel 表格"——学会建表和设规则,你的数据才能住得舒服、住得安全。

1

创建数据表

🖱️ 方式一:用 Workbench 图形界面建表
💡 通俗理解
就像用 Excel "新建表格"一样——在 Workbench 左边的导航栏里找到你的数据库,右键点 Tables → Create Table,然后填表名、加列就行了,全程鼠标操作,不用写代码。

打开建表界面后,你会看到很多设置项,下面逐一解释:

界面字段含义注意事项
Table Name 表名 最多 64 字符,不区分大小写,不能用 SQL 关键字(如 select、table)
Charset/Collation 字符集 / 排序规则 一般用默认的 utf8mb4 就行
Engine 存储引擎 默认 InnoDB,支持事务和外键
Comments 表的备注说明 写清楚这张表是干什么的
Column Name 列名(字段名) 同一张表不能有重名的列
Data Type 数据类型 就是上节课学的 INT、VARCHAR 等

列名右边还有一排复选框缩写,它们代表约束

缩写全称作用
PKPrimary Key主键,本行的"身份证"
NNNot Null不能为空
UQUnique值不能重复
AIAuto Increment自增长(每新增一行自动 +1)
UNUnsigned非负数
ZFZero Fill不够位数的前面补零
BBinary按二进制存储
GGenerated基于公式自动计算的列
⌨️ 方式二:用 SQL 命令建表
💡 通俗理解
鼠标点着方便,但写 SQL 更精确、可复用。就像装修房子——你可以口头跟装修师傅说"我要个柜子"(图形界面),也可以给一份精确的施工图纸(SQL 语句),图纸能反复使用,也更不容易出错。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] <表名> ( <字段名> <数据类型> [NOT NULL] [DEFAULT ] [AUTO_INCREMENT] [COMMENT '说明'], ... [PRIMARY KEY (字段)], [索引/外键定义] ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
TEMPORARY:加了这个关键字,创建的是临时表,连接断开后自动消失。
i
IF NOT EXISTS:如果已经有同名的表就不创建,防止报错。很实用!

下面看一个完整的例子——在 teaching 数据库中建一个学生表:

CREATE TABLE `s` ( `sno` CHAR(10) NOT NULL COMMENT '学号', `sn` VARCHAR(45) NOT NULL COMMENT '姓名', `sex` ENUM('男','女') NOT NULL DEFAULT '男' COMMENT '性别', `age` INT NOT NULL COMMENT '年龄', `maj` VARCHAR(45) NOT NULL COMMENT '专业', `dept` VARCHAR(45) NOT NULL COMMENT '院系', PRIMARY KEY (`sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
每个字段后面的 COMMENT 就是"注释",方便别人(或未来的你)看懂每列是什么意思。养成好习惯!
2

定义表的约束

💡 通俗理解
如果建表是"盖房子",那约束就是"门禁规则"——谁能进、谁不能进、哪些信息必须填。约束的目的只有一个:防止脏数据混进来

MySQL 一共有 5 种常用约束,可以看成 5 道"安检门":

NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK
🚫 NOT NULL 约束——"不能留空"
💡 通俗理解
就像填快递单——收件人姓名和电话是必填项,不填就寄不出去。加了 NOT NULL 的字段就是必填项,插入数据时不允许留空。
<字段名> <数据类型> [NULL | NOT NULL]
CREATE TABLE 's_null' ( 'sno' CHAR(10) NOT NULL COMMENT '学号', -- 必填! 'sn' VARCHAR(45) COMMENT '姓名', -- 可以为空 'sex' ENUM('男','女') DEFAULT '男' COMMENT '性别', 'age' INT COMMENT '年龄', 'maj' VARCHAR(45) COMMENT '专业', 'dept' VARCHAR(45) COMMENT '院系' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
🔑 UNIQUE 约束——"不能重复"
💡 通俗理解
就像班级里的学号——每个人的学号必须不一样,如果两个人学号相同,系统就不让录入。UNIQUE 保证某列(或多列组合)的值在整张表里不会出现重复

UNIQUE 有两种写法:列约束(跟在字段后面)和 表约束(写在所有字段之后):

列约束写法

直接在字段后加 UNIQUE
'sn' VARCHAR(45) UNIQUE COMMENT '姓名'

表约束写法

在最后单独声明,可以组合多列
UNIQUE ('sn', 'sex') -- sn + sex 组合不重复
一张表可以有多个 UNIQUE 约束。
i
UNIQUE 字段允许 NULL(空值不算重复)。
🏷️ PRIMARY KEY 约束——"身份证号"
💡 通俗理解
每个中国公民有一个唯一的身份证号,不能为空、不能重复。主键 = 身份证号,它是每一行数据的唯一标识。一张表只能有一个主键,但主键可以由多个字段组合而成(联合主键)。

单字段主键(列约束)

CREATE TABLE `s_primary` ( 'sno' CHAR(10) NOT NULL PRIMARY KEY COMMENT '学号', ... );

联合主键(表约束)

CREATE TABLE 'sc_primary' ( 'sno' CHAR(10) NOT NULL, 'cno' CHAR(10) NOT NULL, 'score' DECIMAL(5,2), PRIMARY KEY ('sno', 'cno') );

PRIMARY KEY vs UNIQUE 有什么区别?

对比项PRIMARY KEYUNIQUE
数量 一张表只能 1 个 可以有多个
允许 NULL? ❌ 绝对不行 ✅ 允许多个 NULL(MySQL 认为 NULL ≠ NULL,不算重复)
能同时用在同一列? ❌ 没必要。PK 已经自带"不重复+不为空",再加 UQ 等于重复建索引——就像你已经是校长了,再给自己发一张教职工证,身份重叠、浪费资源。
🔗 FOREIGN KEY 约束——"表间的桥梁"
💡 通俗理解
选课表里的"学号"必须是学生表里真实存在的学号——不能凭空编一个学号出来。外键就是把两张表"牵手连接"起来的纽带,确保数据之间的引用关系是正确的。
主表 B
(如:学生表 s)
🔑 主键 sno
引用
从表 A
(如:选课表 sc)
🔗 外键 sno
[CONSTRAINT <约束名>] FOREIGN KEY (<从表字段>) REFERENCES <主表名> (<主表字段>) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
CREATE TABLE 'sc_foreign' ( 'sno' CHAR(10) NOT NULL COMMENT '学号', 'cno' CHAR(10) NOT NULL COMMENT '课程号', 'score' DECIMAL(5,2) COMMENT '成绩', FOREIGN KEY ('cno') REFERENCES 'c' ('cno'), FOREIGN KEY ('sno') REFERENCES 's' ('sno') ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

当主表数据被删除或更新时,从表怎么办?有 4 种策略:

RESTRICT

🚫 拒绝!有人引用就不让删改主表。

CASCADE

🔄 级联!主表删了,从表对应的也跟着删。

SET NULL

📝 置空!主表删了,从表外键变成 NULL。

NO ACTION

≈ RESTRICT,效果相同。

!
主表必须已经存在且有主键,从表外键的数据类型必须和主表主键完全一致
i
外键可以为 NULL(表示"未选课"),但主键绝不能为 NULL。
✅ CHECK 约束——"数值范围检查"
💡 通俗理解
考试成绩只能是 0~100 分,如果有人填了 -5 分或者 200 分,系统应该直接拒绝。CHECK 就是给字段加一个"合理范围"的检查条件。
CHECK (<条件表达式>)
CREATE TABLE 'sc_check' ( 'sno' CHAR(10) NOT NULL, 'cno' CHAR(10) NOT NULL, 'score' DECIMAL(5,2) CHECK(score >= 0 AND score <= 100), PRIMARY KEY ('sno', 'cno') ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CHECK 可以写简单条件(如 age > 0),也可以写复杂表达式(如 score >= 0 AND score <= 100)。
i
如果 CHECK 写在所有字段和主键/外键之后,就叫表约束;写在字段后面就是列约束

5 种约束速查表

约束一句话解释生活类比
NOT NULL 不能为空 快递单必填项
UNIQUE 不能重复 班级学号不能撞车
PRIMARY KEY 唯一标识 = NOT NULL + UNIQUE 身份证号
FOREIGN KEY 关联另一张表 选课表引用学生表的学号
CHECK 限制取值范围 成绩只能 0~100